package com.lujuncheng.tankgame;

import java.io.Serializable;
import java.util.Vector;

/**
 * @author LuJuncheng
 * @version 1.0
 * 坦克超类
 */
public class Tank implements Serializable {
    private int x;//坦克的横坐标
    private int y;//坦克的纵坐标
    private int direct;//坦克方向 0上 1右 2下 3左
    Vector<Shot> shots=new Vector<>();//可以发射多颗子弹
    static Vector<Tank> tanks =new Vector<>();//所有坦克
    private int speed=2;//坦克速度
    boolean isLive=true;

    /**
     * 坦克移动
     */
    public void move(){
        switch (getDirect()){
            case 0:
                if ((y-speed)>0){
                    y-=speed;
                }
                break;
            case 1:
                if ((x+speed+60)<1000){
                    x+=speed;
                }
                break;
            case 2:
                if ((y+speed+60)<750){
                    y+=speed;
                }
                break;
            case 3:
                if (x-speed>0){
                    x-=speed;
                }
                break;
        }
    }

    /**
     * 发射子弹
     */
   public void shotBullet(){
       Shot shot=null;
       if (!isLive){
          return;
       }
       //创建shot对象，根据当前tank对象的位置和方向来创建Shot对象
       switch (getDirect()){
           case 0:
               shot=new Shot(getX()+20,getY(),0);
               break;
           case 1:
               shot=new Shot(getX()+60,getY()+20,1);
               break;
           case 2:
               shot=new Shot(getX()+20,getY()+60,2);
               break;
           case 3:
               shot=new Shot(getX(),getY()+20,3 );
               break;
       }

       if (shot!=null&& shot.isLive){
           shots.add(shot);
           //启动子弹线程
           new Thread(shot).start();
       }
   }

    /**
     * 判断是否和其它坦克发生重叠或者碰撞
     * @return
     */
    public boolean isTouchOhterTank(){
        //判断当前敌人坦克this方向
        switch (this.getDirect()){
            case 0://上
                //让当前敌人坦克和其它所有的坦克比较
                for (int i = 0; i < tanks.size(); i++) {
                    Tank tank = tanks.get(i);
                    if (tank!=this){
                        //如果敌人坦克是上/下//老韩分析
                        //1．如果敌人坦克是上/下x的范围[enemyTank.getX()，enemyTank.getX() + 40]
                        //                   y的范围 [enemyTank. getY(O),enemyTank.getY() + 60]
                        //如果敌人坦克是上下
                        if (tank.getDirect()==0||tank.getDirect()==2){
                            //this左上坐标
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+40
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+60){
                                return true;
                            }
                            //this右上坐标
                            if (getX()+40>= tank.getX()
                                    &&getX()+40<=tank.getX()+40
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+60){
                                return true;
                            }
                        }
                        //如果敌人坦克是左右
                        if (tank.getDirect()==1||tank.getDirect()==3){
                            //this左上坐标
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+60
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+40){
                                return true;
                            }
                            //this右上坐标
                            if (getX()+40>= tank.getX()
                                    &&getX()+40<=tank.getX()+60
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1://右
                //this坦克向右 比较 右上 x:getX()+60
                //                    ,y:getY();
                //                右下 x:getX()+60
                //                    ,y:getY()+40
                for (int i = 0; i < tanks.size(); i++) {
                    Tank tank = tanks.get(i);
                    if (tank!=this){//不跟自己比较
                        //别的坦克 上下
                        if (tank.getDirect()==0||tank.getDirect()==2){
                            //this右上坐标
                            if (getX()+60>= tank.getX()
                                    &&getX()+60<=tank.getX()+40
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+60){
                                return true;
                            }
                            //this右下坐标
                            if (getX()+60>= tank.getX()
                                    &&getX()+60<=tank.getX()+40
                                    &&getY()+40>= tank.getY()
                                    &&getY()+40<=tank.getY()+60){
                                return true;
                            }
                        }
                        //如果敌人坦克是左右
                        if (tank.getDirect()==1||tank.getDirect()==3){
                            //this左上坐标
                            if (getX()+60>= tank.getX()
                                    &&getX()+60<=tank.getX()+60
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+40){
                                return true;
                            }
                            //this右上坐标
                            if (getX()+60>= tank.getX()
                                    &&getX()+60<=tank.getX()+60
                                    &&getY()+40>= tank.getY()
                                    &&getY()+40<=tank.getY()+40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2://下
                for (int i = 0; i < tanks.size(); i++) {
                    Tank tank = tanks.get(i);
                    if (tank!=this){//不跟自己比较
                        //别的坦克 上下
                        if (tank.getDirect()==0||tank.getDirect()==2){
                            //this左下坐标
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+40
                                    &&getY()+60>= tank.getY()
                                    &&getY()+60<=tank.getY()+60){
                                return true;
                            }
                            //this右下坐标
                            if (getX()+40>= tank.getX()
                                    &&getX()+40<=tank.getX()+40
                                    &&getY()+60>= tank.getY()
                                    &&getY()+60<=tank.getY()+60){
                                return true;
                            }
                        }
                        //如果敌人坦克是左右
                        if (tank.getDirect()==1||tank.getDirect()==3){
                            //this左下坐标
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+60
                                    &&getY()+60>= tank.getY()
                                    &&getY()+60<=tank.getY()+40){
                                return true;
                            }
                            //this右下坐标
                            if (getX()+40>= tank.getX()
                                    &&getX()+40<=tank.getX()+60
                                    &&getY()+60>= tank.getY()
                                    &&getY()+60<=tank.getY()+40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3://左
                for (int i = 0; i < tanks.size(); i++) {
                    Tank tank = tanks.get(i);
                    if (tank!=this){//不跟自己比较
                        //别的坦克 上下
                        if (tank.getDirect()==0||tank.getDirect()==2){
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+40
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+60){
                                return true;
                            }
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+40
                                    &&getY()+40>= tank.getY()
                                    &&getY()+40<=tank.getY()+60){
                                return true;
                            }
                        }
                        //如果敌人坦克是左右
                        if (tank.getDirect()==1||tank.getDirect()==3){
                            //this左下坐标
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+60
                                    &&getY()>= tank.getY()
                                    &&getY()<=tank.getY()+40){
                                return true;
                            }
                            //this右下坐标
                            if (getX()>= tank.getX()
                                    &&getX()<=tank.getX()+60
                                    &&getY()+40>= tank.getY()
                                    &&getY()+40<=tank.getY()+40){
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
    }

    /**
     * 线程sleep50ms
     * 省去重复代码
     */
    public void sleep50s(){
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public Tank(int x,int y){
        this.x=x;
        this.y=y;
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
